home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / initgroups.c < prev    next >
C/C++ Source or Header  |  1989-07-21  |  1KB  |  51 lines

  1. /*
  2.  * Copyright (c) 1983 Regents of the University of California.
  3.  * All rights reserved.  The Berkeley software License Agreement
  4.  * specifies the terms and conditions for redistribution.
  5.  */
  6.  
  7. #if defined(LIBC_SCCS) && !defined(lint)
  8. static char sccsid[] = "@(#)initgroups.c    5.3 (Berkeley) 4/27/86";
  9. #endif LIBC_SCCS and not lint
  10.  
  11. /*
  12.  * initgroups
  13.  */
  14. #include <stdio.h>
  15. #include <sys/param.h>
  16. #include <grp.h>
  17.  
  18. struct group *getgrent();
  19.  
  20. initgroups(uname, agroup)
  21.     char *uname;
  22.     int agroup;
  23. {
  24.     int groups[NGROUPS], ngroups = 0;
  25.     register struct group *grp;
  26.     register int i;
  27.  
  28.     if (agroup >= 0)
  29.         groups[ngroups++] = agroup;
  30.     setgrent();
  31.     while (grp = getgrent()) {
  32.         if (grp->gr_gid == agroup)
  33.             continue;
  34.         for (i = 0; grp->gr_mem[i]; i++)
  35.             if (!strcmp(grp->gr_mem[i], uname)) {
  36.                 if (ngroups == NGROUPS) {
  37. fprintf(stderr, "initgroups: %s is in too many groups\n", uname);
  38.                     goto toomany;
  39.                 }
  40.                 groups[ngroups++] = grp->gr_gid;
  41.             }
  42.     }
  43. toomany:
  44.     endgrent();
  45.     if (setgroups(ngroups, groups) < 0) {
  46.         perror("setgroups");
  47.         return (-1);
  48.     }
  49.     return (0);
  50. }
  51.